//
//  SLComposeView.swift
//  langligelang
//
//  Created by 秦－政 on 2016/10/31.
//  Copyright © 2016年 pete. All rights reserved.
//

import UIKit
import pop

class SLComposeView: UIView {
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        // 设置大小
        size = CGSize(width: SLSCREENW, height: SLSCREENH)
        setupUI()
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    private func setupUI(){
        // 添加背景图片
        addSubview(bgImageView)
        // 添加标语
        addSubview(sloganImageView)
        sloganImageView.snp_makeConstraints { (make) in
            make.centerX.equalTo(bgImageView)
            make.top.equalTo(bgImageView).offset(100)
        }
        // 添加按钮
        addChildButton()
    }
    // 添加6个子按钮的方法
    private func addChildButton(){
        //  按钮的宽度
        let buttonWidth: CGFloat = 80
        //  按钮的高度
        let buttonHeight: CGFloat = 110
        //  计算每个按钮的间距
        let buttonMargin: CGFloat = (width - 3 * buttonWidth) / 4
        
        for i in 0..<6 {
            // 计算列的索引
            let colIndex = i % 3
            // 计算行的索引
            let rowIndex = i / 3
            let button = SLComposeMenuButton()
            //  设置 tag
            button.tag = i
            // 添加点击事件
            button.addTarget(self, action: #selector(buttonAction(btn:)), for: .touchUpInside)
            //  根据下标获取对应的菜单模型数据
            let model = composeMenuArray[i]
            button.setImage(UIImage(named:model.icon!), for: .normal)
            button.setTitle(model.title!, for: .normal)
            // 设置大小
            button.size = CGSize(width: buttonWidth, height: buttonHeight)
            // 设置x，y坐标
            button.x = CGFloat(colIndex) * buttonWidth + CGFloat(colIndex + 1) * buttonMargin
            button.y = CGFloat(rowIndex) * buttonMargin + CGFloat(rowIndex) * buttonHeight + SLSCREENH
            addSubview(button)
            //  保存菜单按钮
            composeButtonArray.append(button)
        }
    }
    // 点击按钮的操作
    @objc private func buttonAction(btn:UIButton){
        
        UIView.animate(withDuration: 0.25, animations: {
            for button in self.composeButtonArray {
                button.alpha = 0.2
                if button == btn {
                    
                    //  表示要执行放大操作
                    button.transform = CGAffineTransform(scaleX: 2, y: 2)
                } else {
                    //  表示要执行缩小操作
                    button.transform = CGAffineTransform(scaleX: 0.2, y: 0.2)
                }
            }
            
        }) { (_) in
            
            UIView.animate(withDuration: 0.25, animations: {
                for button in self.composeButtonArray {
                    button.alpha = 1
                    button.transform = CGAffineTransform.identity
                }
                }, completion: { (_) in
                    //  弹出控制器
                    //  类名字符串转成对象的问题
                    //  1. 直接通过类名获取 class 返回 nil -> 解决办法 自己定义的类需要加上命名空间  let className = NSStringFromClass(HMComposeViewController.self)
                    //  2. 直接通过 class 创建对象保存,原因需要制定是什么 class 类型
                    //  获取控制类型
                    //  let a = HMComposeViewController.self
                    // 获取点击按钮对应的模型
                    let model = self.composeMenuArray[btn.tag]
                    let classType = NSClassFromString(model.className!) as! UIViewController.Type
                    // 直接调用 init 构造函数
                    let vc = classType.init()
                    //  初始化导航视图控制器
                    let nav = UINavigationController(rootViewController: vc)
                    // 弹出控制器
                    self.target?.present(nav, animated: true, completion: {
                        self.removeFromSuperview()
                    })
                    
            })
        }
        
    }
    
    //  显示罩层
    /*
     1. 要传人目标控制器
     2. 封装添加视图操作
     */
    func show(target: UIViewController){
        self.target = target
        // 把视图添加到传入的控制器
        target.view.addSubview(self)
        // 开启pop动画
        startPopAnimation(isUp: true)
    }
    // MARK - pop动画
    fileprivate func startPopAnimation(isUp:Bool){
        if isUp == false {
            // 表示向下的pop动画 数组需要反转
            composeButtonArray = composeButtonArray.reversed()
        }
        // 遍历菜单按钮
        for (i,button) in self.composeButtonArray.enumerated() {
            // 创建pop动画对象
            let animation = POPSpringAnimation(propertyNamed: kPOPViewCenter) // pop 动画改变中心位置
            if isUp {
                // 动画执行的目的地
                animation?.toValue = NSValue(cgPoint:CGPoint(x: button.centerX, y: button.centerY - 350))
            }else{
                // 动画执行的目的地
                animation?.toValue = NSValue(cgPoint: CGPoint(x: button.centerX, y: button.centerY + 350))
            }
            // 弹簧系数 -> 0 - 20 越大 抖动幅度越大
            animation?.springBounciness = 10
            // 初始速度
            animation?.springSpeed = 10
            // 设置动画开始时间 CACurrentMediaTime()获取系统的绝对时间-> 开机时间到现在的时间的秒数
            animation?.beginTime = CACurrentMediaTime() + Double(i) * 0.025
            button.pop_add(animation, forKey: nil)
        }
    }
    // MARK - 截取图片的方法
    private func getScreenShot() -> UIImage {
        // 获取当前的主窗口
        let window = UIApplication.shared.keyWindow!
        // 开启图形上下文
        UIGraphicsBeginImageContext(window.size)
        // 区域
        let rect = CGRect(origin: CGPoint.zero, size: window.size)
        // 根据区域绘制
        window.drawHierarchy(in: rect, afterScreenUpdates: false)// 不需要高清图片所以不需要加载完毕
        let image = UIGraphicsGetImageFromCurrentImageContext()
        // 关闭图形上下文
        UIGraphicsEndImageContext()
        // 返回截图
        return image!
    }
    
    // MARK: - 懒加载控件
    // 背景图片并设置模糊效果
    fileprivate lazy var bgImageView: UIImageView = UIImageView(image: self.getScreenShot().applyLightEffect())
    // 标语
    fileprivate lazy var sloganImageView: UIImageView = UIImageView(image: UIImage(named: "compose_slogan"))
    // 记录当前创建的6个撰写菜单按钮
    fileprivate lazy var composeButtonArray: [UIButton] = [UIButton]()
    fileprivate var target: UIViewController?
    //  获取 plist 数组模型数据
    fileprivate lazy var composeMenuArray: [SLComposeMenu] = self.loadComposeData()
    //  加载 plist 数据
    fileprivate func loadComposeData() -> [SLComposeMenu] {
        // plist 文件路径
        let path = Bundle.main.path(forResource: "compose.plist", ofType: nil)!
        // 加载plist 文件里的数据
        let dicArray = NSArray(contentsOfFile: path)!
        // 使用YYModel 完成字典转模型
        let modelArray = NSArray.yy_modelArray(with: SLComposeMenu.self, json: dicArray) as! [SLComposeMenu]
        return modelArray
    }
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        startPopAnimation(isUp: false)
        //  使用 gcd 延时0.3秒后执行
        DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.3) {
            self.removeFromSuperview()
        }
    }
}

